package controller

import (
	"errors"
	"fmt"
	"gitee.com/chejiangyi/bsfgo/core/base2"
	"gitee.com/chejiangyi/bsfgo/core/utils"
	"gitee.com/chejiangyi/bsfgo/gin2/utils2"
	"github.com/gin-gonic/gin"
	"net/http"
)

type BaseApiController struct {
}

// Json 优先调用接口方法，否则使用默认实现
func (m *BaseApiController) Json(c *gin.Context, obj interface{}) {
	c.JSON(http.StatusOK, obj)
}

// JsonSuccess 优先调用接口方法，否则使用默认实现
func (m *BaseApiController) JsonSuccess(c *gin.Context, data interface{}) {
	c.JSON(http.StatusOK, base2.NewSuccessApiResponseEntity[any](data))
}

// JsonError 优先调用接口方法，否则使用默认实现
func (m *BaseApiController) JsonError(c *gin.Context, msg string) {
	c.JSON(http.StatusOK, base2.NewErrorApiResponseEntity[any](msg))
}

// CatchJsonError 优先调用接口方法，否则使用默认实现
func (m *BaseApiController) CatchJsonError(c *gin.Context) {
	if err := recover(); err != nil {
		utils.LogUtil.Error2("【接口访问异常】%v\r\n【参数信息】%v\r\n【错误详情】%v",
			c.Request.URL.Path, utils2.WebUtil.GetRequestInfo(c), err)
		var bsfError *base2.BsfBizError
		ok := errors.As(utils.ErrorUtil.ConvertToError(err), &bsfError)
		if base2.BsfConfigInstance.GetWebResponseDetailErrorEnabled() {
			if ok {
				m.JsonError(c, bsfError.ToJson())
			} else {
				m.JsonError(c, fmt.Sprintf("系统异常:%v", err))
			}
		} else {
			if ok {
				m.JsonError(c, bsfError.ToJsonNoTrace())
			} else {
				m.JsonError(c, "系统异常")
			}
		}
	}
}

// RequestParam 优先调用接口方法，否则使用默认实现
func (m *BaseApiController) GetParam(c *gin.Context, key string, defaultValue any) any {
	return utils2.WebUtil.GetRequestParam(c, key, defaultValue)
}
func (m *BaseApiController) GetParamAddData(c *gin.Context, data map[string]any, key string, defaultValue any) any {
	v := utils2.WebUtil.GetRequestParam(c, key, defaultValue)
	data[key] = v
	return v
}
func (m *BaseApiController) BindRequestJson(c *gin.Context, jsonObj any) any {
	if err := c.ShouldBindJSON(&jsonObj); err != nil {
		panic(base2.NewBsfError("请求体非json格式"))
	}
	return jsonObj
}

/*通用错误处理*/
func (m *BaseApiController) CheckBizError(msg string, err error) {
	if err != nil {
		panic(base2.NewBsfBizError2(msg, err))
	}
}

func (m *BaseApiController) CheckError(err error) {
	if err != nil {
		panic(err)
	}
}
